package co.edu.udea.xyz.bl.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import co.edu.udea.xyz.bl.ClienteService;
import co.edu.udea.xyz.dao.ClienteDAO;
import co.edu.udea.xyz.dao.PersonaDAO;
import co.edu.udea.xyz.dto.Cliente;
import co.edu.udea.xyz.dto.Persona;
import co.edu.udea.xyz.dto.Solicitud;
import co.edu.udea.xyz.util.exception.BLInversionesException;
import co.edu.udea.xyz.util.exception.XYZException;

public class ClienteServiceImpl implements ClienteService {
	static final Logger log = Logger.getLogger(ClienteServiceImpl.class);
	ClienteDAO clienteDAO;
	PersonaDAO personaDAO;
	
	public ClienteDAO getClienteDAO() {
		return clienteDAO;
	}

	public void setClienteDAO(ClienteDAO clienteDAO) {
		this.clienteDAO = clienteDAO;
	}

	public PersonaDAO getPersonaDAO() {
		return personaDAO;
	}

	public void setPersonaDAO(PersonaDAO personaDAO) {
		this.personaDAO = personaDAO;
	}

	public ClienteServiceImpl() {
	
	}

	@Override
	public void guardarCliente(int cliente, int cedula)throws BLInversionesException, XYZException {
		log.info("Metodo guardarCliente, valida que la persona exista.");
		
		Persona persona = personaDAO.obtener(cedula);
		   log.info("La Persona identificada con la Cedula: "+ persona.getCedula());
		   log.info("Nombre: " + persona.getNombre());
		   log.info("Apellidos: "+ persona.getApellidos());
		   log.info("Correo Electronico: "+ persona.getEmail());
		   log.info("Telefono: "+ persona.getTelefono());
		   log.info("Celular: "+ persona.getCelular());	
		
		if(persona.getApellidos() == null){
			throw new BLInversionesException("La persona no existe en BD");
		}
		
		Cliente clienteNuevo = new Cliente();
		clienteNuevo.setCliente(cliente);
		clienteNuevo.setIdentificacion(persona);
			
		log.info("Se va ha guardar un nuevo Cliente.");
		clienteDAO.guardar(clienteNuevo);
			
	}

	@Override
	public void actualizarCliente(int cliente, int cedula)throws BLInversionesException, XYZException {
		log.info("Metodo actualizarCliente, valida que el cliente exista.");
		Cliente clienteBD = null;
		clienteBD = clienteDAO.obtener(cliente);
		log.info("Se obtuvo el cliente");
		Persona persona = personaDAO.obtener(cedula);
		if(persona.getApellidos() == null){
			throw new XYZException("Error al obtener la persona asociada al cliente.");
		}
		clienteBD.setIdentificacion(persona);
		
		log.info("Cliente Base de Datos actualizado:"+clienteBD.getCliente() + "Identificacion "+clienteBD.getIdentificacion().getCedula());
		clienteDAO.actualizar(clienteBD);
		
	}
	

	@Override
	public Cliente obtenerCliente(int cliente) throws BLInversionesException,
			XYZException {
		log.info("Metodo obtener un Cliente pasando su codigo cliente como parametro.");
		if(cliente<=0){
			throw new BLInversionesException("El codigo cliente no corresponde a un registro de la base de datos."
					+ "\n Recuerde que debe ser un numero positivo.");
		}
		log.info("Obtiene el cliente por medio de la persistencia de hibernate");
		Cliente micliente = null;
		micliente = (Cliente)clienteDAO.obtener(cliente); 
		log.info("Se retorna el Cliente a la que corresponde el codigo.");
		return micliente;
	}

	@Override
	public List<Cliente> obtenerListaClientes() throws BLInversionesException,
			XYZException {
		List<Cliente> listaClientes = null;
		listaClientes = clienteDAO.obtener();
		log.info("Se retorna la lista de Clientes.");
		return listaClientes;
	}

	@Override
	public List<Solicitud> getSolicitudesCliente(int codigoCliente)throws BLInversionesException, XYZException{
		List<Cliente> listaClientes = null;
		List<Solicitud> listaSolicitudes =  new ArrayList<Solicitud>();
		log.info("obtiene la lista de clientes");		
		listaClientes = clienteDAO.obtener();
		
		log.info("busca en la lista");
		for(Cliente client : listaClientes){
			if(client.getCliente() == codigoCliente){
				log.info("encuentra al cliente");
				listaSolicitudes = (List<Solicitud>) client.getSolicitudes();
			}
		}
		log.info("entrega la lista");
		return listaSolicitudes;
		
	}

}
